table of contents
SORT(1) | Narzędzia tekstowe GNU 2.0 | SORT(1) |
NAZWA¶
sort - posortuj linie plików tekstowych
SKŁADNIA¶
OPIS¶
Dokumentacja niniejsza nie jest już utrzymywana i może być niedokładna lub niekompletna. Autorytatywnym źródłem jest obecnie dokumentacja Texinfo. Dostęp do niej uzyskasz wpisując w wierszu poleceń:
Ta strona podręcznika opisuje polecenie sort w wersji GNU.
sort sortuje, zlepia lub porównuje wszystkie linie z podanych plików, lub standardowego wejścia jeśli nie podano żadnych. Nazwa pliku '-' oznacza standardowe wejście. Domyślnie, sort wypisuje rezultaty na standardowe wyjście.
sort ma trzy tryby działania: sortowanie (domyślnie), zlepianie i sprawdzanie posortowania. Następujące opcje zmieniają tryb działania:
- -c
- Sprawdza czy podane pliki są już posortowane; jeśli nie wszystkie są, wypisuje komunikat o błędzie i kończy pracę z kodem równym 1.
- -m
- Zlepia podane pliki sortując je jako grupę. Każdy plik wejściowy powinien być już posortowany indywidualnie. sort działa zawsze sortując, a nie lepiąc; zlepianie udostępniono ponieważ jest ono szybsze w tych przypadkach, w których działa.
Para linii porównywana jest jak następuje: Jeśli podano jakieś pola kluczowe, sort porównuje każdą parę pól, w porządku podanym w linii komend, według skojarzonych opcji porządkowania, aż znaleziona zostanie różnica albo przeszukane zostaną wszystkie pola. Wszystkie porównania wykorzystują porządek znaków określony przez ustawienie narodowe LC_COLLATE, chyba że podano inaczej.
Jeśli użyto której z globalnych opcji Mbdfinr, ale nie podano pól kluczowych, sort porównuje całe linie według opcji globalnych.
W końcu, w ostatniej próbie, kiedy wszystkie porównywane klucze są równe (lub nie podano żadnych opcji porządkujących), sort porównuje linie bajt po bajcie w kolejności sklejania zależnej od maszyny. Ostatnia próba porównania bierze pod uwagę opcję -r. Opcja -s (stable) wyłącza ostatnią próbę porównania, tak że linie, w których wszystkie pola są równie w porównaniu zostają pozostawione w pierwotnej kolejności względnej. Jeśli nie podano żadnych pól ani opcji globalnych, -s nie wywołuje efektów.
GNU sort nie ma limitów co do długości linii ani ograniczeń co do bajtów dozwolonych w linii. Dodatkowo, jeśli ostatni bajt pliku wejściowego nie jest nową linią, GNU sort po cichu takową dostawia. Kończący linię znak nowej linii w porównywaniu jest jej częścią. Na przykład, bez opcji, przy sortowaniu ASCII, linia rozpoczynająca się tabulacją zostanie umieszczona przed pustą linią, gdyż w porządku leksykograficznym ASCII znak tabulacji poprzedza znak nowej linii.
Przy błędzie sort kończy pracę z kodem '2'.
Jeśli ustawiono zmienną środowiskową TMPDIR, sort używa jej jako katalogu w którym należy umieścić pliki tymczasowe, zamiast domyślnego /tmp. Opcja -T kat-tymcz jest jeszcze jednym sposobem wybrania katalogu dla plików tymczasowych; zastępuje ona ową zmienną środowiskową.
Poniższe opcje wpływają na porządkowanie linii wyjścia. Mogą być one określone globalnie lub jako część konkretnego pola kluczowego. Jeśli nie podano żadnego pola kluczowego, opcje globalne stosują się do porównań całych linii; w przeciwnym razie opcje globalne są dziedziczone przez pola kluczowe, dla których nie określono żadnych specjalnych opcji. Opcje -b, -d, -f i -i klasyfikują znaki zgodnie z ustawieniami narodowymi LC_CTYPE.
- -b
- Ignoruje początkowe znaki puste podczas szukania kluczy sortowania w każdej linii.
- -d
- Sortuje w porządku 'książki telefonicznej': podczas sortowania ignoruje wszystkie znaki oprócz liter, cyfr i znaków pustych.
- -f
- Podstawia znaki małych liter za odpowiednie znaki dużych liter podczas sortowania tak aby, na przykład, 'b' sortowało się tak samo jak 'B'.
- -g
- Sortuje numerycznie, posługując się standardową funkcją C strtod, przekształcając przedrostek każdej linii na liczbę zmiennoprzecinkową podwójnej precyzji. Umożliwia to podawanie liczb zmiennoprzecinkowych w notacji naukowej, jak '1.0e-34' czy '10e100'. Nie zgłasza nadmiaru, niedomiaru czy błędów konwersji. Wykorzystuje następujący porządek leksykograficzny:
- * linie nie rozpoczynające się liczbami (wszystkie uważane za równe).
- * wartości NaN ("Not a Number") w arytmetyce zmiennoprzecinkowej IEEE w spójnej, ale zależnej od architektury komputera kolejności.
- * minus nieskończoność.
- * liczby skończone w kolejności rosnącej (z równymi -0 i +0).
- * plus nieskończoność.
Opcji tej należy używać tylko wtedy, gdy nie ma innej alternatywy; jest znacznie wolniejsza niż -n i przy konwersji na zmiennoprzecinkowe można utracić informację.
- -i
- Ignoruje znaki niedrukowalne (spoza zakresu ASCII 040-176 ósemkowo, włącznie) podczas sortowania.
- -M
- Każdy początkowy łańcuch składający się z dowolnej ilości białych znaków plus trzy litery będące skrótem nazwy miesiąca jest zamieniany na DUŻE litery i porównywany w porządku 'JAN' < 'FEB' < ... < 'DEC.' Przy porównywaniu nieprawidłowe nazwy są mniejsze od poprawnych. Ustawienie narodowe LC_TIME wyznacza pisownię nazw miesięcy.
- -n
- Sortowanie numeryczne: każdą linię rozpoczyna liczba.
Składają się na nią opcjonalne białe
znaki, opcjonalny znak -, oraz zero lub więcej cyfr, które
mogą być oddzielone separatorami tysięcy, plus
opcjonalnie występujący separator dziesiętny i zero
lub więcej cyfr dziesiętnych. Ustawienie narodowe
LC_NUMERIC określa znak separatora dziesiętnego i
separatora tysięcy.
sort -n wykorzystuje coś, co może być uważane za niekonwencjonalną metodę porównywania łańcuchów reprezentujących liczby zmiennoprzecinkowe. Zamiast najpierw zamieniać każdy łańcuch na typ 'double' języka C a następnie porównywać ich wartości, sort wyrównuje znaki separatora dziesiętnego w dwu łańcuchach i porównuje je znak po znaku. Jedną z korzyści z takiego podejścia jest jego szybkość. W praktyce jest to o wiele wydajniejsze niż wykonywanie dwu odpowiednich konwersji string-double (lub nawet string-integer) i następnie porównywanie liczb podwójnej precyzji. Dodatkowo, nie występuje tu towarzysząca utrata dokładności. Konwersja przed porównaniem każdego łańcucha na typ 'double' ograniczałaby dokładność do około 16 cyfr w większości systemów.
Nie jest rozpoznawany ani początkowy znak '+', ani notacja wykładnicza. Do porównywania numerycznego takich łańcuchów należy użyć opcji -g.
- -r
- Odwraca rezultat porównania, tak iż linie z większymi wartościami klucza pojawiają się w wyniku wcześniej, a nie później.
Inne opcje to:
- -o plik-wyj
- Wypisuje wynik do plik-wyj, a nie na standardowe wyjście. Jeśli plik-wyj jest jednym z plików wejściowych, sort kopiuje go do pliku tymczasowego przed sortowaniem i wypisaniem wyniku do plik-wyj.
- -t separator
- Używa znaku separator jako separatora pól podczas szukania kluczy sortowania w każdej linii. Domyślnie pola oddzielone są łańcuchem pustym pomiędzy znakami nie będącymi białym znakiem i białymi znakami. To znaczy, linię wejścia sort rozkłada na pola ' foo' i ' bar'. Separator pól nie jest uważany za część ani pola, które go poprzedza ani tego, które po nim następuje.
- -u
- W przypadku domyślnym lub opcji -m, wypisuje tylko pierwszą z sekwencji linii porównanych jako równe. Dla opcji -c sprawdza czy żadna para kolejnych linii w wyniku porównania nie jest równa.
- -k poz1[,poz2]
- Zalecana, POSIX-owa składnia określania pól sortowania. Pole jest częścią linii pomiędzy poz1 i poz2 (lub końcem linii, jeśli pominięto poz2) włącznie. Pola i pozycje znaków numerowane są począwszy od 1. Zatem sortowanie według drugiego pola wymagałoby '-k 2,2'. Poniżej znajdziesz więcej przykładów.
- -z
- Traktuje wejście jako zestaw linii zakończonych bajtem zerowym (znak ASCII NUL (null)) a nie ASCII LF (koniec linii). Opcja ta może być przydatna w połączeniu z `perl -0' lub `find -print0' i `xargs -0', które robią to samo w celu niezawodnego zachowania dowolnych nazw ścieżek (nawet zawierających znaki końca linii).
- +poz1 [-poz2]
- Przestarzała, tradycyjna opcja określania pól sortowania. Określa pole w każdej linii, którego należy użyć jako klucza sortowanie. Pole to składa się z części linii zaczynającej się na poz1 aż do (ale nie włącznie z) poz2 (albo do końca linii jeśli nie podano poz2). Pola i pozycje znaków numerowane są począwszy od 0.
Pozycja w polu sortowania w opcjach -k i + ma postać f.c, gdzie f to numer pola, które ma zostać użyte a c to numer pierwszego znaku od początku pola (dla +poz) albo od końca poprzedniego pola (dla -poz). Część .c pozycji może zostać pominięta; w tym przypadku uważa się ją za oznaczającą pierwszy znak pola. Jeśli podano opcję -b, część .c określenia pola liczona jest od pierwszego niepustego znaku pola (dla +poz) lub ostatniego niepustego znaku stojącego po poprzednim polu (dla -poz).
Argument +poz lub -poz może także zawierać dołączoną dowolną z liter opcji Mbdfinr, wówczas dla tego konkretnego pola nie są używane globalne opcje porządkowania. Opcja -b może być dołączona niezależnie do jednej z lub obu części +poz i -poz określenia pola, a jeśli została odziedziczona z opcji globalnych, zostanie dołączona do obydwu. Jeśli użyto opcji -n lub -M, co zakłada opcję -b, opcja -b stosuje się do zarówno do części +poz jak i -poz określenia pola. Klucze mogą się rozciągać na kilka pól.
Dodatkowo, kiedy GNU sort wywołany został z dokładnie jednym argumentem, rozpoznawane są następujące opcje:
ZGODNE Z¶
Historyczne (z BSD i System V) implementacje sort różniły się w interpretacji niektórych opcji, szczególnie -b, -f, oraz -n. GNU sort naśladuje zachowanie POSIXowe, które jest zwykle (ale nie zawsze!) podobne do zachowania z System V. Według POSIX -n nie zakłada już -b. Dla spójności, w ten sam sposób zmieniono -M. Może to wpłynąć na znaczenie pozycji znaków w określeniach pól w pewnych zagmatwanych przypadkach. Jeśli cię to gryzie, rozwiązaniem jest dodanie wyraźnej opcji -b.
PRZYKŁADY¶
A oto nieco przykładów ilustrujących rozmaite kombinacje opcji. Do określania kluczy sortowania wykorzystywana jest w nich POSIX-owa opcja -k zamiast przestarzałej składni +poz1-poz2.
* Sortowanie w malejącej (odwrotnej) kolejności numerycznej:
sort -nr
* Sortowanie alfabetyczne, przy pominięciu pierwszych i drugich pól. Posługuje się pojedynczym kluczem złożonym ze znaków od początku trzeciego pola do końca każdej linii:
sort -k3
* Sortowanie numeryczne według drugiego pola i rozstrzyganie przeszkód przez sortowanie alfabetyczne wg trzeciego i czwartego znaku piątego pola. Znakiem ograniczającym pola jest ':'
Zauważ, że w przypadku napisania '-k 2' zamiast '-k 2,2', sort wykorzystałby wszystkie znaki począwszy od drugiego pola, a skończywszy na końcu linii jako pierwszy klucz numeryczny. W większości zastosowań, traktowanie jako numeryczne kluczy złożonych z więcej niż jednego pola nie daje oczekiwanego wyniku.
sort -t : -k 2,2n -k 5.3,5.4
Zauważ też, że do określnika końca pola dla pierwszego klucza został zastosowany modyfikator -n. Byłby równoważny podaniu '-k 2n,2' lub '-k 2n,2n'. Wszystkie modyfikatory z wyjątkiem b odnoszą się do odnośnego pola, niezależnie od tego czy są dołączone do określenia początku pola, końca czy obu.
* Sortowanie pliku haseł według piątego pola, ignorowane są początkowe białe znaki. Sortowanie linii z równymi wartościami piątego pola według numerycznego identyfikatora użytkownika z pola trzeciego:
Alternatywą jest zastosowanie globalnego modyfikatora numerycznego -n:
sort -t : -k 5b,5 -k 3,3n /etc/passwd
sort -t : -n -k 5b,5 -k 3,3 /etc/passwd
* Utworzenie pliku znaczników (tags) w kolejności sortowania niewrażliwej na wielkość liter:
Użycie w tym przypadku '-print0', '-z' i '-0' oznacza, że ścieżki zawierające znaki nowej linii nie będą rozbijane przez operację operację sortowania.
find src -type f -print0 | \
sort -t / -z -f | xargs -0 etags --append
* Na koniec: do zignorowania zarówno początkowych jak i końcowych białych znaków można zastosować modyfikator b do końcowego określnika pierwszego klucza
lub użyć globalnego modyfikatora -b zamiast -n i bezpośredniego n przy określeniu drugiego klucza:
sort -t : -n -k 5b,5b -k 3,3 /etc/passwd
sort -t : -b -k 5,5 -k 3,3n /etc/passwd
UWAGI¶
Różne znaczenie numerów pól w zależności od użycia opcji -k stwarza zamieszania. To wszystko wina POSIX!
ZGŁASZANIE BŁĘDÓW¶
Błędy proszę zgłaszać, w jęz. ang., do <bug-textutils@gnu.org>.
COPYRIGHT¶
Copyright © 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
ZOBACZ TAKŻE¶
OD TŁUMACZA¶
Zaktualizowano i poszerzono wg dokumentacji Texinfo dla narzędzi tekstowych GNU wersji 2.0.
FSF | sierpień 1999 |